package com.keta.generator;


import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.sql.SQLException;
import java.util.Map;

import org.apache.commons.fileupload.FileUpload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;

import com.keta.generator.db.DataSource;
import com.keta.generator.db.DbFactory;
import com.keta.generator.util.FileUtils;
import com.keta.generator.vo.Table;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;


/**
 * 代码生成器抽象类
 * @author robin
 * 该类提供代码生成的一些公共方法
 * 该抽象类偏向于使用模板生成代码，提供了freemarker渲染方法(可以不用)
 * 从数据库的表生成代码比较常见 ，提供了获取数据库表元数据的方法
 */
public abstract class AbstractGenerate{

	protected static Logger logger = LoggerFactory.getLogger(AbstractGenerate.class);
	
	protected static String separator = File.separator;
	
	protected Configuration cfg ;
	
	protected DataSource dataSource ;
	
	
	
	public AbstractGenerate() throws Exception{
		dataSource =  DbFactory.getDataSource();
		
		cfg = new Configuration();
		cfg.setDefaultEncoding("UTF-8");
		cfg.setDateFormat("yyyy-MM-dd HH:mm:ss");
		cfg.setDirectoryForTemplateLoading(new File(AbstractGenerate.class.getResource("/generator/template").getPath()));
	}
	
	
	/**
	 * 将生成的代码写到文件中
	 * @param path
	 * @param code
	 */
	protected void writeCodeToFile(String code,String path){
		FileUtils.writeFile(code, path);
	}
	
	
	/**
	 * 根据模板路径和model数据渲染模板
	 * @param path
	 * @param model
	 * @return
	 * @throws IOException 
	 * @throws TemplateException 
	 */
	protected String render(String path,Object model) throws IOException, TemplateException{
		
		Template template = cfg.getTemplate(path);
		StringWriter result = new StringWriter();
		template.process(model, result);
		return result.toString();
	}
	

	/**
	 * 获取数据库连接
	 * @param path
	 * @param model
	 * @return
	 * @throws SQLException 
	 */
	protected Table getTable(String tableName) throws SQLException{
		return dataSource.getTable(tableName);
	}
	
	
}
